Add --disable-fsync option to pull-local, and API to repo
authorColin Walters <walters@verbum.org>
Sat, 1 Feb 2014 03:18:13 +0000 (22:18 -0500)
committerColin Walters <walters@verbum.org>
Sat, 1 Feb 2014 03:18:13 +0000 (22:18 -0500)
This will be used by guestmount - it's WAY faster.  We only take disks
as a unit, so it's safe.  If the process fails halfway through, we
just start over from scratch the next time anyways.

src/libostree/ostree-repo-commit.c
src/libostree/ostree-repo-private.h
src/libostree/ostree-repo.c
src/libostree/ostree-repo.h
src/ostree/ot-builtin-pull-local.c

index ad910dceda527bfadaf9ed24a0273acfc4b340ee..e470b8b7e7a86e10b2c08bdbd4d3d001f17b70b1 100644 (file)
@@ -157,10 +157,13 @@ commit_loose_object_trusted (OstreeRepo        *self,
       /* Ensure that in case of a power cut, these files have the data we
        * want.   See http://lwn.net/Articles/322823/
        */
-      if (fsync (fd) == -1)
+      if (!self->disable_fsync)
         {
-          ot_util_set_error_from_errno (error, errno);
-          goto out;
+          if (fsync (fd) == -1)
+            {
+              ot_util_set_error_from_errno (error, errno);
+              goto out;
+            }
         }
           
       if (!g_output_stream_close (temp_out, cancellable, error))
index 0a3b0a017834f521d062b18de357f159eb456070..711bfea2fce850cff3c76393d527fb701c1c3fa1 100644 (file)
@@ -57,6 +57,7 @@ struct OstreeRepo {
 
   gboolean inited;
   gboolean in_transaction;
+  gboolean disable_fsync;
   GHashTable *loose_object_devino_hash;
   GHashTable *updated_uncompressed_dirs;
   GHashTable *object_sizes;
index d9938d92ef3343a4feb46b9e9910d28345f7307a..65c2bdfc8b769c8b8ef049d412cd05ef806feac0 100644 (file)
@@ -552,6 +552,24 @@ ostree_repo_open (OstreeRepo    *self,
   return ret;
 }
 
+/**
+ * ostree_repo_set_disable_fsync:
+ * @self: An #OstreeRepo
+ * @disable_fsync: If %TRUE, do not fsync
+ *
+ * Disable requests to fsync() to stable storage during commits.  This
+ * option should only be used by build system tools which are creating
+ * disposable virtual machines, or have higher level mechanisms for
+ * ensuring data consistency.
+ */
+void
+ostree_repo_set_disable_fsync (OstreeRepo    *self,
+                               gboolean       disable_fsync)
+{
+  self->disable_fsync = disable_fsync;
+}
+
+
 /**
  * ostree_repo_get_path:
  * @self:
index 3f311f9f974a4e7ae1f19b55be6880f624363293..b3f263e8114c7657ff292cfedb3d02394e9190f7 100644 (file)
@@ -48,6 +48,9 @@ gboolean      ostree_repo_open   (OstreeRepo     *self,
                                   GCancellable   *cancellable,
                                   GError        **error);
 
+void          ostree_repo_set_disable_fsync (OstreeRepo    *self,
+                                             gboolean       disable_fsync);
+
 gboolean      ostree_repo_create (OstreeRepo     *self,
                                   OstreeRepoMode  mode,
                                   GCancellable   *cancellable,
index 0feeddf201e6753398d1213096540c7751e6879f..b5b5728fd8f7f481093f0d3d22c5384544f8e814 100644 (file)
 #include "otutil.h"
 
 static char *opt_remote;
+static gboolean opt_disable_fsync;
 
 static GOptionEntry options[] = {
   { "remote", 0, 0, G_OPTION_ARG_STRING, &opt_remote, "Add REMOTE to refspec", "REMOTE" },
+  { "disable-fsync", 0, 0, G_OPTION_ARG_NONE, &opt_disable_fsync, "Do not invoke fsync()", NULL },
   { NULL }
 };
 
@@ -206,6 +208,9 @@ ostree_builtin_pull_local (int argc, char **argv, OstreeRepo *repo, GCancellable
   if (!ostree_repo_open (data->src_repo, cancellable, error))
     goto out;
 
+  if (opt_disable_fsync)
+    ostree_repo_set_disable_fsync (data->dest_repo, TRUE);
+
   data->threadpool = ot_thread_pool_new_nproc (import_one_object_thread, data);
 
   src_repo_dir = g_object_ref (ostree_repo_get_path (data->src_repo));